﻿using System;
using System.Configuration;
using System.IO;
using Agile.Common;
using Agile.Common.Loggers;
using Agile.Genie.Generators;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System.Diagnostics;

namespace NantGenie
{

    class Program
    {
        public static UnityContainer container = new UnityContainer();
        
        static void Main(string[] args)
        {
            SetupUnityContainer();

            BuildFileCreator creator = new BuildFileCreator();
            container.BuildUp(creator);

            DirectoryInfo rootWorkingDirectory = new DirectoryInfo(@"C:\Dev\AltNet");
            creator.GenerateBuildFiles(rootWorkingDirectory);
            creator.GenerateMasterBuild(rootWorkingDirectory);
        }

        private static void SetupUnityContainer()
        {
            container = new UnityContainer();
            UnityConfigurationSection section
                = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            section.Containers.Default.Configure(container);
            Console.WriteLine("Unity container successfully configured.");
        }
    }

    public class BuildFileCreator
    {
        /// <summary>
        /// Search through the directory and all subdirectories and find all project files
        /// and generate a .build file for them.
        /// </summary>
        public void GenerateBuildFiles(DirectoryInfo rootWorkingDirectory)
        {
            Files.LoopThroughSubDirectories(rootWorkingDirectory, GoThroughFiles);
        }

        /// <summary>
        /// Go through all of the files in the directory.
        /// </summary>
        /// <param name="directory"></param>
        private void GoThroughFiles(DirectoryInfo directory)
        {
            Files.GoThroughFilesIn(directory, GenerateCodeForFile);
        }

        /// <summary>
        /// Generate the code for the file.
        /// </summary>
        /// <param name="fileInfo">The file to generate code for.</param>
        private void GenerateCodeForFile(FileInfo fileInfo)
        {
            // only generate for project files.
            if (!Files.IsTheRightFileType(fileInfo, "csproj", "vbproj"))
                return;

            var generator = BuildFileGenerator.Build(fileInfo);

            if (generator != null)
            {
                logger.Write(string.Format("{0} begin generate for {1}", DateTime.Now.ToString("mm:ss:fff"), fileInfo.Name));
                generator.SaveToFile();
                Program.container.BuildUp(generator);
                logger.Write(string.Format("{0} end generate", DateTime.Now.ToString("mm:ss:fff")));
            }
        }

        // set the default logger
        private ILogger logger = new DebugLogger();

        [Dependency]
        public ILogger Logger
        {
            get { return logger; }
            set { logger = value; }
        }

        internal void GenerateMasterBuild(DirectoryInfo rootWorkingDirectory)
        {
            MasterBuildFileGenerator master = MasterBuildFileGenerator.Build(rootWorkingDirectory, false, false);
            Program.container.BuildUp(master);
            master.SaveToFile();
        }
    }
        
}
